/*
 * @Author: Mr.Mao
 * @Date: 2021-06-23 21:05:06
 * @LastEditTime: 2021-06-23 23:15:27
 * @Description: 
 * @LastEditors: Mr.Mao
 * @autograph: 任何一个傻子都能写出让电脑能懂的代码，而只有好的程序员可以写出让人能看懂的代码
 */
import Koa from 'koa'

export type TTypeConstructors = StringConstructor | NumberConstructor | BooleanConstructor | ArrayConstructor | ObjectConstructor

/** 调用配置項 */
export interface TComplexType {
  /** 校验类型, 传入类型实例 */
  type?: TTypeConstructors | TTypeConstructors[]
  /** 正则校验 */
  regExp?: RegExp
  /** 是否必填 */
  required?: boolean
  /** 是否拦截该字段(不允许传入) */
  intercept?: boolean
  /** 提示信息 '{_key_}' 为当前字段值索引占位符 '{_type_}' 为当前类型占位符 */
  message?: string
  /** 自定义校验器 */
  validator?: (value: any) => boolean | Promise<boolean>
}

/** 初始化配置 */
export interface ParamsErrorOption {
  messages?: {
    type?: string
    regExp?: string
    required?: string
    intercept?: string
  },
  status?: number
}
/** 错误类型 */
export interface ThrowErrorOption {
  status?: number
  message: string
}
/** 消息类型 */
export type MessageKeys = 'type' | 'regExp' | 'required' | 'intercept'
/** 调用配置 */
export type TVerifyOption = Record<string, TTypeConstructors | TComplexType>
/** 调用函数 */
export type TVerifyParams = (params: Record<string, any>, verifyOption: TVerifyOption) => Promise<void>
/** Koa 中间件类型 */
export type IMiddleware<StateT = any, CustomT = {}> = Koa.Middleware<StateT, CustomT & { verifyParams: TVerifyParams }>;
/** 校验类型 */
export type VerifyType =
  // 校验器
  'validator' |
  // 必传
  'required' |
  // 拦截器
  'intercept' |
  // 类型校验
  'type' |
  // 正则校验
  'regExp'

declare module "koa" {
  interface BaseContext {
    verifyParams: TVerifyParams
  }
}